package com.woniu.controller;

import com.woniu.entity.PageResult;
import com.woniu.entity.Result;
import com.woniu.pojo.Car;
import com.woniu.service.ICarService;
import com.woniu.vo.CarOrderDetailVo;
import com.woniu.vo.CarOrderQueryVo;
import com.woniu.vo.CarOrderVo;
import com.woniu.vo.CarQueryVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author 定雄
 * @since 2022-10-12
 */
@RestController
@RequestMapping("/car")
@Slf4j
@Api(tags = "车辆管理")
public class CarController extends BaseController{
    //注入车辆业务逻辑层对象
    @Autowired
    private ICarService carService;

    /**
     * 车辆管理页面1，根据用户条件对车辆进行分页查询
     * @param currentPage 当前页
     * @param pageSize 每页最大记录数
     * @param carQueryVo 页面查询条件
     * @return
     */
    @ApiOperation(value = "车辆信息分页查询")
    @PostMapping("/search/{currentPage}/{pageSize}")
    public Result carSearch(
            @PathVariable Integer currentPage,
            @PathVariable Integer pageSize,
            @RequestBody CarQueryVo carQueryVo
            ){
        //1.调用方法查询分页数据
        PageResult pageResult=carService.search(carQueryVo,currentPage,pageSize);
        return toDataResult(pageResult);
    }

    /**
     * 对车辆进行逻辑删除
     * @param carId
     * @return
     */
    @ApiOperation("车辆逻辑删除")
    @DeleteMapping("/{carId}")
    public Result carRemove(@PathVariable Long carId){
        //1.调用方法根据id对车辆表进行逻辑删除
        boolean remove = carService.removeById(carId);
        //2.返回数据
        return toResult(remove);
    }

    /**
     * 根据车辆id查询车辆数据
     * @param carId
     * @return
     */
    @ApiOperation(value = "车辆查询")
    @GetMapping("/{carId}")
    public Result queryCarById(@PathVariable String carId){
        Car car = carService.getById(carId);
        return toDataResult(car);
    }

    /**
     * 禁用车辆
     * @param carId
     * @return
     */
    @ApiOperation(value = "车辆状态修改：禁用")
    @GetMapping("/statusForbiden/{carId}")
    public Result modifyCarStatusForbiden(@PathVariable String carId){
        Boolean modify=carService.modifyCarStatus(carId);
        return toResult(modify);

    }

    /**
     * 将车辆进行启用
     * @param carId
     * @return
     */
    @ApiOperation(value = "车辆状态修改：正常")
    @GetMapping("/statusNormal/{carId}")
    public Result modifyCarStatusNormal(@PathVariable String carId){
        Boolean flag=carService.modifyCarStatusNormal(carId);
        return toResult(flag);
    }


    /**
     * 新增车辆
     * @param car
     * @return
     */
    @ApiOperation(value = "新增车辆")
    @PostMapping("/add")
    public Result addCar(@RequestBody Car car){
        //1.调用方法新增车辆
        boolean save = carService.save(car);
        //2.返回新增结果
        return toResult(save);
    }


    /**
     * 将用户与车辆进行解绑
     * @param carId 车辆id
     * @return
     */
    @ApiOperation(value = "解绑用户与车辆")
    @GetMapping("/unbindingUserAndCar/{carId}")
    public Result unbindingUserAndCar(@PathVariable String carId){
        //1.调用方法修改车辆表用户值
        Boolean flag=carService.unbindingUserAndCar(carId);
        //2.返回数据
        return toResult(flag);
    }

    /**
     * 车辆绑定用户
     * @param carId 车辆id
     * @param userId 用户id
     * @return
     */
    @ApiOperation(value = "车辆绑定用户")
    @GetMapping("/bingdingUserAndCar/{carId}/{userId}")
    public Result bingdingUserAndCar(
            @PathVariable String carId,
            @PathVariable String userId
            ){
        //1.调用方法修改车辆表用户值，当然，这里绑定用户的话，必须得先确保这辆车没有绑定其他用户
        Boolean flag=carService.bingdingUserAndCar(carId,userId);
        //2.返回数据
        return toResult(flag);

    }


    /**
     * 根据车辆id对车辆订单信息进行自主分页查询
     * @param carId
     * @return
     */
    @ApiOperation(value = "车辆订单信息分页查询")
    @GetMapping("/order/{carId}")
    public Result carOrderSearch(@PathVariable Long carId){
        PageResult pageResult=carService.carOrderSearch(carId);
        return toDataResult(pageResult);
    }


    /**
     * 车辆订单列表的条件分页查询
     * @param currentPage 当前页
     * @param pageSize 每页最大记录数
     * @param carId 车辆id
     * @param carOrderQueryVo 车辆订单查询条件
     * @return
     */
    @ApiOperation(value = "车辆订单条件分页查询")
    @PostMapping("/order/{currentPage}/{pageSize}/{carId}")
    public Result carOrderPageSearch(
            @PathVariable Integer currentPage,
            @PathVariable Integer pageSize,
            @PathVariable Long carId,
            @RequestBody CarOrderQueryVo carOrderQueryVo
            ){
        //1.调用方法查询数据
        PageResult pageResult=carService.carOrderPageSearch(currentPage,pageSize,carId,carOrderQueryVo);
        //2.返回数据
        return toDataResult(pageResult);

    }

    /**
     * 根据订单编号查询车辆订单信息
     * @param orderId 订单编号
     * @return
     */
    @ApiOperation(value = "根据订单编号查询车辆订单信息")
    @GetMapping("/orderNum/{orderId}")
    public Result carOrder(@PathVariable Long orderId){
        //1.调用方法查询数据
        CarOrderDetailVo carOrderDetailVo=carService.carOrder(orderId);
        //2.将数据返回
        return toDataResult(carOrderDetailVo);
    }







}
